#include "Common.h"
#include "dma.h"
#include <string.h>
/**
 * @brief 将8位无符号整数进行位交换
 *
 * 将传入的8位无符号整数中的二进制位进行交换，具体规则为：
 * 1. 将第1位和第0位交换，第3位和第2位交换，以此类推。
 * 2. 再将第2位和第0位交换，第6位和第4位交换，以此类推。
 * 3. 最后将第4位和第0位交换，第8位和第4位交换，以此类推。
 *
 * @param data 需要进行位交换的8位无符号整数
 *
 * @return 位交换后的8位无符号整数
 */
uint8_t data_swap_u8(uint8_t  data)
{
	data = ((data >> 1u) & 0x55u) | ((data & 0x55u) << 1u) ;
	data = ((data >> 2u) & 0x33u) | ((data & 0x33u) << 2u) ;
	data = ((data >> 4u) & 0x0fu) | ((data & 0x0fu) << 4u) ;
	return data;
}

void memcpy_dma(void  * const dst, void const * const src, uint16_t n)
{
	DMA_M2M_Transfer(dst, src, n);
}


//斜坡值求取
uint16_t LadderValueSet(LadderValue_t * pLadderValueInfo)
{
	uint16_t AimValue = pLadderValueInfo->AimValue;
	uint16_t CurrentValue = pLadderValueInfo->CurrentValue;
	uint16_t Delta = pLadderValueInfo->Delta;

    uint16_t temp;
    uint16_t newLadderValue = CurrentValue;

    if( AimValue < CurrentValue )//当前值大于目标值
    {
        temp = CurrentValue - AimValue;
        if( temp >= Delta ){
            newLadderValue = CurrentValue - Delta;
        }else{
            newLadderValue = AimValue;
        }

		if( newLadderValue < (pLadderValueInfo->MinValue) ){
			newLadderValue = pLadderValueInfo->MinValue;
		}
    }
    else if( AimValue > CurrentValue )//当前值小于目标值
    {
        temp = AimValue - CurrentValue;
        if( temp >= Delta ){
            newLadderValue = CurrentValue + Delta;
        }else{
            newLadderValue = AimValue;
        }        
    }

	if( Delta < (pLadderValueInfo->MaxDelta) ){
		Delta++;
		pLadderValueInfo->Delta = Delta;
	}

	return newLadderValue;
}

//获取数字位数(正数)
uint8_t calNumberLength_U16(uint16_t number)
{
    if(  number < 10 ){
        return 1;
    }else if( number >= 10 && number < 100 ){
        return 2;
    }else if( number >= 100 && number < 1000 ){
        return 3;
    }else if( number >= 1000 && number < 10000 ){
        return 4;
    }else{
        return 5;
    }
}
